反转链表【leetcode206】
递归
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null){ //判断空链表
return null;
}
if(head.next==null){ //递归终止条件
return head;
}
ListNode cur = reverseList(head.next);//开始递归
head.next.next=head;
head.next=null;//将原头结点(反转后的尾节点)的next置为null
return cur;
}
}
迭代
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
ListNode cur = head, prev = null;
while (cur != null) {
ListNode next = cur.next;//记录后驱结点
cur.next = prev; //反转
prev = cur;//前驱节点向后移动
cur = next;//当前节点向后移动
}
return prev;
}
}
反转链表之指定位置处反转【leetcode92】
合并两个有序链表【leetcode21】
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode res = new ListNode(-1); //新建一个具有头结点的链表,最后返回头结点的下一个节点
ListNode prev=res;//设置一个指针,不断向后移动
while(list1!=null&&list2!=null){ //有一个链表为空则退出循环
if(list1.val<=list2.val){
prev.next=list1; //为新链表添加节点
list1=list1.next; //list1的指针不断向后移动
}else{
prev.next=list2; //为新链表添加节点
list2=list2.next; //list2的指针不断向后移动
}
prev=prev.next; //新链表指针不断向后移动
}
if(list1==null){
prev.next=list2; //直接将剩下不为空的链表接在新链表的后面
}else{
prev.next=list1;
}
return res.next; //返回新链表头结点的下一个节点(即首元结点)
}
}