—链表的插入
以链表合并为例:https://leetcode.cn/problems/merge-two-sorted-lists/submissions/
1 Example1 Solution 迭代 Accepted / Used
// 题目大意:删除,值为val的结点(单次删除), 并返回头结点
class Solution {
// l1,l2递增
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
// 增加一个头结点,减少程序的复杂性
ListNode temp = new ListNode(-100,l1),res = temp;
if(temp.next==null) return l2;
while(temp.next!=null&&l2!=null) {
if(temp.val<=l2.val&&l2.val<=temp.next.val) {
temp.next = new ListNode(l2.val,temp.next);
l2 = l2.next;
}
temp = temp.next;
}
if(l2!=null) temp.next = l2;
return res.next;
}
}
//小结: 当遇到 需要用借用到上一个结点来完成的操作,最好加一个头结点,方便操作
1 Example2 Solution 递归 Accepted / Used
//思路,最好还是有一个头结点,返回res.next,因为不能保证一定有元素节省判断为空的条件
//递归结束条件是l1或l2为空
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1==null) return l2;
if(l2==null) return l1;
//最后不会有l1==null&&l2==null同时为空的情况,除非一开始全为空
ListNode res = new ListNode(0),temp;
if(l1.val<=l2.val) {
res.next = l1;
l1 = l1.next;
res.next.next = mergeTwoLists(l1,l2);
}else {
res.next = l2;
l2 = l2.next;
res.next.next = mergeTwoLists(l1,l2);
}
return res.next;
}
}
//小结: 当遇到 需要用借用到上一个结点来完成的操作,最好加一个头结点,方便操作