知识点
归并 链表
题意解析
本题需要把两个有序链表合并成一个, 这可以使用一个归并的思路, 只不过数据结构由数组变成的链表, 但是原理是一样的
先建立虚拟链表头结点, 之后存在以下三种情况
- 1. 两个链表都没有走到末尾, 选一个值较大的结点加入链表末尾, 指向该结点的指针向后移动
- 2. 第一个链表没有走到末尾, 第二个已经在末尾了; 只需要依次把剩余的第一个链表的部分加入末尾
- 3. 第二个链表没有走到末尾, 第一个已经在末尾了; 只需要依次把剩余的第二个链表的部分加入末尾
- (2, 3 在1循环执行结束之后不会同时出现, 至多只会有一个成立)
时间复杂度
和链表长度成正比
AC code (C++)
/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : val(x), next(nullptr) {} * }; */ class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param l1 ListNode类 * @param l2 ListNode类 * @return ListNode类 */ ListNode* mergeEnergyValues(ListNode* l1, ListNode* l2) { // write code here auto dummy = new ListNode(200); // 每次先加入较大的一个 归并的思路 auto p = l1, q = l2, cur = dummy; while (p and q) { if (p->val > q->val) { cur->next = p; p = p->next; } else { cur->next = q; q = q->next; } cur = cur->next; } while (p) { cur->next = p; cur = cur->next; p = p->next; } while (q) { cur->next = q; cur = cur->next; q = q->next; } return dummy->next; } };