算法学习 25 集合
1.反转链表
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例 1:

输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]
示例 2:

输入:head = [1,2] 输出:[2,1]
示例 3:
输入:head = [] 输出:[]
/*** 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) {List<Integer> list = new LinkedList<Integer>();ListNode cur = head;while(cur!=null){list.add(cur.val);cur=cur.next;}ListNode ans =new ListNode(0);//创建虚拟头节点ListNode pre = ans;//指针for(int i=list.size()-1;i>=0;i--){pre.next=new ListNode(list.get(i)); // 从后往前取元素创建新节点pre=pre.next;}return ans.next; // 返回新链表的头节点}
}
2.合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:

输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [], l2 = [] 输出:[]
示例 3:
输入:l1 = [], l2 = [0] 输出:[0]
/*** 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) {// if(list1 == null) {// return list2;// }// if(list2 == null) {// return list1;// }// if(list1.val < list2.val) {// list1.next = mergeTwoLists(list1.next, list2);// return list1;// } else {// list2.next = mergeTwoLists(list1, list2.next);// return list2;// }List<Integer> list = new LinkedList<Integer>();while(list1!=null&&list2!=null){if(list1.val>list2.val){list.add(list2.val);list2=list2.next;}else{list.add(list1.val);list1=list1.next;}}// 处理剩余未遍历的节点(其中一个链表已空)while (list1 != null) {list.add(list1.val);list1 = list1.next;}while (list2 != null) {list.add(list2.val);list2 = list2.next;}ListNode ans = new ListNode(0);ListNode pre = ans;for(int i=0;i<list.size();i++){pre.next=new ListNode(list.get(i));pre=pre.next;}return ans.next;}
}
