203.移除元素
题目描述
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回新的头节点 。
示例 1:
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
示例 2:
输入:head = [], val = 1
输出:[]
示例 3:
输入:head = [7,7,7,7], val = 7
输出:[]
做题思路
该题的做题思路较为简单,即通过构造一个虚拟头节点(dummy)来遍历链表,然后用cur,temp指针辅助解题。但再次刷这道题的时候发现了一些以前没有注意到的细节,在此分析。
什么时候需要动态分配内存?
- 在链表后创建新节点
- 程序结束后需要返回的值
所以在该程序中cur,temp不需要分配内存,但需要返回head,而head=dummy->next,所以。
dummy->next 和 dummy.next 的区别
- dummy->next:用于指针变量(dummy 是指向结构体的指针)。
等价于 (*dummy).next,即先解引用指针再访问成员。 - dummy.next:
用于结构体变量(dummy 是结构体实例)。
直接访问结构体的成员。
在该函数中:
dummy是一个结构体实例(不是指针),因此用 dummy.next。
cur 是一个指针(指向 dummyHead 或后续节点),因此用 cur->next。
代码实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val) {
struct ListNode dummyHead={0,head};//栈内存分配
struct ListNode *cur=&dummyHead;
while(cur->next)
{
if(cur->next->val==val)
{
struct ListNode *temp=cur->next;
cur->next=cur->next->next;
free(temp);
}else
{
cur=cur->next;
}
}
return dummyHead.next;
}
21.合并链表
题目描述
将两个升序链表合并为一个新的 升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [], l2 = []
输出:[]
示例 3:
输入:l1 = [], l2 = [0]
输出:[0]
解题思路
递归/迭代:创建一个虚拟头节点,作为合并后的新链表头节点前的一个节点。比较l1,l2的值,将较小值加入到新链表的后面,如果相等,则加入那个都可。重复上述过程直到某一个链表为空。最后返回新链表的头节点。
代码实现
递归:
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
struct ListNode dummy = {}; // 用虚拟头节点简化代码逻辑
struct ListNode* cur = &dummy;
while (list1 && list2) {
if (list1->val < list2->val) {
cur->next = list1; // 把 list1 加到新链表中
list1 = list1->next;
} else { // 相等的情况加哪个节点都是可以的
cur->next = list2; // 把 list2 加到新链表中
list2 = list2->next;
}
cur = cur->next;
}
cur->next = list1 ? list1 : list2; // 拼接剩余链表
return dummy.next;
}
迭代:
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
if (list1 NULL) return list2; // 注:如果都为空则返回空
if (list2 NULL) return list1;
if (list1->val < list2->val) {
list1->next = mergeTwoLists(list1->next, list2);
return list1;
}
list2->next = mergeTwoLists(list1, list2->next);
return list2;
}