Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.
Example:
Input: 1->2->4, 1->3->4 Output: 1->1->2->3->4->4
题意就是合并两个排序链表。
我的算法思路:维护其中一个链表,另一个链表从头往后不断缩减,并将每次出队的节点插入到第一个链表中。因此时间复杂度为O(n),空间复杂度为O(1)。
然而LeetCode给的链表接口是head->next,所以我的代码只能合并从第二个节点开始的剩余部分。
传入参数为头节点(head)的方案:
#include <iostream> struct ListNode { int val; ListNode *next; //ListNode(int x) : val(x), next(NULL) {} }; ListNode* Create_LinkList_1(int Length) { ListNode*L1, *rear, *memory; L1 = new ListNode; rear = L1; for(int i = 1; i <= Length; i++) { memory = new ListNode; std::cout << "L1:"; std::cin >> memory->val; rear->next = memory; rear = memory; } rear->next = nullptr; return L1; } ListNode* Create_LinkList_2(int Length) { ListNode*L2, *rear, *memory; L2 = new ListNode; rear = L2; for(int i = 1; i <= Length; i++) { memory = new ListNode; std::cout << "L2:"; std::cin >> memory->val; rear->next = memory; rear = memory; } rear->next = nullptr; return L2; } class Solution { public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if(!(l1 && l2)) return nullptr; else if(l1 && !l2) return l1; else if(!l1 && l2) return l2; else { // 2->4->6 1->3->5 ListNode*head = l1; ListNode*p1 = l1->next; ListNode*p2 = l2->next; ListNode*q1; while(p1 && p2) { if(p1->val >= p2->val) { ListNode*node = p2; p2 = p2->next; node->next = p1; if(p1 == head->next) head->next = node; else q1->next = node; p1 = node; p1 = p1->next; } q1 = p1; p1 = p1->next; } if (p2) q1->next = p2; return head; } } }; int main() { Solution solve; ListNode* L1, *L2; L1 = Create_LinkList_1(3); L2 = Create_LinkList_2(3); ListNode*head = solve.mergeTwoLists(L1, L2)->next; while(head) { std::cout << head->val << ' '; head = head->next; } return 0; }
传入参数是head->next的方案:
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if(!(l1 && l2)) return NULL; else if(l1 && !l2) return l1; else if(!l1 && l2) return l2; else { ListNode*head = l1; ListNode*q1 = l1; while(l1 && l2) { if(l1->val >= l2->val) { ListNode*node = l2; l2 = l2->next; if (head == l1) { node->next = l1->next; l1->next = node; } else { node->next = l1; q1->next = node; l1 = node; } l1 = l1->next; } q1 = l1; l1 = l1->next; } if (l2) q1->next = l2; return head; } } };
但没有过:
目前我猜测是因为LeedCode的特殊数据,链表l1只有1个节点(还有一个头节点,但传入的是l1=head->next),且不为空,但没有给成员val赋值,这样的话,我的算法就会被卡住了。