知识点
归并 链表
题意解析
本题需要把两个有序链表合并成一个, 这可以使用一个归并的思路, 只不过数据结构由数组变成的链表, 但是原理是一样的
先建立虚拟链表头结点, 之后存在以下三种情况
- 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;
}
};

京公网安备 11010502036488号