6.17 addTwoNumbers & reverseLinkedListII & partitionList

  • to do


1.

  • 5%..
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
       ListNode* dummy = new ListNode (-1);
       ListNode* curr = dummy;
       int carry = 0, sum = 0;
       while (l1 || l2) {
           if (!l1) {
               sum = carry + l2->val;
               l2 = l2->next;
           } else if (!l2) {
               sum = carry + l1->val;
               l1 = l1->next;
           } else {
               sum = l1->val + l2->val + carry;
               l1 = l1->next;
               l2 = l2->next;
           }
           carry = sum/10;
           curr->next = new ListNode(sum%10);
           curr = curr->next;
       }
       if (carry) curr->next = new ListNode(carry);
       return dummy->next;
    }

Reverse Linked List

  • simple iterative - JS

let reverseList = function(head) {
    let prev = null;
    while (head) {
        let next = head.next;
        head.next = prev;
        prev = head;
        head = next;
    }
    return prev;
};
  • simple recursive - JS

var reverseList = function(head) {
    if (!head || !head.next) return head;
    let newh = reverseList(head.next);
    head.next.next = head;
    head.next = null;
    return newh;
};

2] Reverse Linked List II
note: avoid changing params I guess

    ListNode* reverseBetween(ListNode* head, int m, int n) {
        if (m >= n || !head) return head;
        ListNode* dummy = new ListNode(-1);
        dummy->next = head;
        ListNode* lholder = dummy;
        int ct = m;
        while (--ct) lholder = lholder->next;

        ListNode* prev = lholder->next, *curr = prev->next, *next = curr->next;
        ct = n-m;
        while (--ct) {
            curr->next = prev;
            prev = curr;
            curr = next;
            next = curr->next;
        }
        lholder->next->next = curr->next;
        curr->next = prev;
        lholder->next = curr;
        return dummy->next;
    }

or insert at head

var reverseBetween = function(head, m, n) {
    // if (!head || m >= n) return head;
    let dummy = new ListNode(-1);
    dummy.next = head;

    let prev = dummy;
    for (let i = 0; i < m-1; ++i) {
        prev = prev.next;
    }

    const lholder = prev;
    prev = prev.next;
    let curr = prev.next;
    for (let i = m; i < n ; ++i) {
        prev.next = curr.next;
        curr.next = lholder.next;
        lholder.next = curr;
        curr = prev.next;
    }
    return dummy.next;
};

3] Partition List

    ListNode* partition(ListNode* head, int x) {
        ListNode dummy(-1);
        dummy.next = head;

        ListNode dummy2(-1);
        ListNode* tail2 = &dummy2;

        ListNode* prev = &dummy;
        ListNode* curr;
        while (curr = prev->next) {
            if (curr->val < x) {
                prev->next = curr->next;
                tail2->next = curr;
                tail2 = curr;
            } else {
                prev = curr;
            }
        }
        tail2->next = dummy.next;
        return dummy2.next;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,357评论 0 33
  • //leetcode中还有花样链表题,这里几个例子,冰山一角 求单链表中结点的个数----时间复杂度O(n)这是最...
    暗黑破坏球嘿哈阅读 5,446评论 0 6
  • # LinkedList系列总结 24/27 [x] Easy [x] Medium [x] Hard 这种题,多...
    Joshua介凌阅读 3,499评论 0 0
  • 2. Add Two Numbers 先初始化两个结点,一个用来做head,一个作为指引node不断向下延续的指针...
    Morphiaaa阅读 4,410评论 0 0
  • 我喜欢吃毛豆,尤其是糟毛豆。我曾经吃过最好吃的糟毛豆,那是在我老家的院子里。 可惜没有人能两次进入同一条河。时光就...
    Graceland阅读 14,762评论 3 11

友情链接更多精彩内容