/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : val(x), next(nullptr) {} * }; */ class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param pHead1 ListNode类 * @param pHead2 ListNode类 * @return ListNode类 */ ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { // write code here if (pHead1 == nullptr && pHead2 == nullptr) return pHead1; ListNode* fore1 = new ListNode(0); ListNode* back1 = new ListNode(0); ListNode* fore2 = new ListNode(0); ListNode* back2 = new ListNode(0); if (pHead1 == nullptr) return pHead2; else { fore1 = pHead1; back1 = pHead1->next; } if (pHead2 == nullptr)return pHead1; else { fore2 = pHead2; back2 = pHead2->next; } ListNode* head = new ListNode(0); if (pHead1->val < pHead2->val) head->next = pHead1; else head->next = pHead2; //loop ListNode* pmin = new ListNode(0); while (true) { while (fore1 != nullptr && fore2 != nullptr) { if (fore1->val < fore2->val) { pmin = fore1; fore1 = fore1->next; } else { break; } } pmin->next = fore2; if (fore1 == nullptr) break; while (fore1 != nullptr && fore2 != nullptr) { if (fore2->val <= fore1->val) { pmin = fore2; fore2 = fore2->next; } else { break; } } pmin->next = fore1; if (fore2 == nullptr) break; } return head->next; } };
采用双工作业的方式,设置两个指针分别沿着两个链表移动,比较两个指针的大小,小的那个向后移动,直到遇到大于另一个指针的位置,然后换另一个指针以同样的方式边移动边比较。另外设置一个pmin指针用于记录以上两个指针的大小翻转时的位置。
(back1和back2指针用不到)