【Linked-list专题-1】445. Add Two Numbers II 328. Odd Even Linked List

来源:互联网 发布:python 最小化到托盘 编辑:程序博客网 时间:2024/06/03 07:14

445. Add Two Numbers II

之前在做第二题Add Two Numerbers就在想,如果给的链表不是反向排列,又该如何做呢,一时间实在没想出来。

今天打算按照各项专题来刷题,先从弱项链表开始吧,结果一上来就看到了这题,正向排列链表相加,最后瞄了一下评论才想起,这不就是栈的使用场景吗!


考虑到栈后就很容易实现了,这边C++的stack,pop和top是分开的两个函数,合并一起写后,代码更整洁了,并且击败了92%的结果!

看来很多人还是惯性思维的将输入链表反向排列再求和。

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:        int mypop(stack<int>& sk){        if(!sk.empty()){            int val = sk.top();            sk.pop();            return val;        }        return 0;    }        ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {        int carry = 0, sum = 0;        ListNode* tail(0);        stack<int> sk1,sk2;        while(l1){            sk1.push(l1->val);            l1 = l1 -> next;        }        while(l2){            sk2.push(l2->val);            l2 = l2 -> next;        }        while(!sk1.empty() || !sk2.empty() || carry){            sum = mypop(sk1) + mypop(sk2) + carry;            carry = sum / 10;            ListNode* node = new ListNode(sum % 10);            node->next = tail;            tail = node;        }                return tail;            }};


328. Odd Even Linked List

这题跟以前遇到的面试题是差不多的,可惜当时手打功夫还不够好,有思路但是就是实现的时候一直出错。

我的做法是生成一个奇数链表和偶尔链表,这题里面遇到两个问题

1. 链表尾没有置next为NULL,导致输入结点数为奇数时,会导致循环链表,造成死循环!!!

2. 仍然是关于复杂度计算问题,题目明显要求O(1)空间复杂度,O(n)时间复杂度,时间是满足了,空间的问题,之前因为感觉自己是另开了两个链表,所以有空间开销,但是解决了1的问题后,提交又通过了,回想一下,其实我只是定义了两个头结点,其他的都是指针之间的操作,应该是O(1)的

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:    ListNode* oddEvenList(ListNode* head) {        ListNode oddHead(0),evenHead(0);        ListNode* oddptr = &oddHead;        ListNode* evenptr = &evenHead;        int index = 1;        while(head){            if(index % 2 == 1){                oddptr->next = head;                oddptr = oddptr->next;                     }            if(index % 2 == 0){                evenptr->next = head;                evenptr = evenptr->next;                   }            head = head->next;            index++;        }        evenptr->next = NULL;           //当结点数为奇数时,偶数链表的最后一个结点指向了原链表中的倒数第二个结点(如[1,2,3],此时evenptr->next = 3的结点,会导致环形链表死循环,因为新链表中,3是奇数链表的结尾,又链接到偶尔链表的开头2,2->3->2)        oddptr->next = evenHead.next;        return oddHead.next;    }};


原创粉丝点击