取中点:
1 ListNode fast = head , slow = head ;
2 ListNode mid = null ;
3 //step 1: find the middle node: when fast reaches the end, slow reaches the mid
4 //note: middle node has to be fast.next != null && fast.next.next != null
5 while (fast != null && fast.next != null && fast.next.next != null){
6 fast = fast.next.next ;
7 slow = slow.next ;
8 }
9 mid = slow ;
翻转:
1 /*1->2->3->4 to 1<-2<-3<-4
2 * p c
3 * */
4 private ListNode reverse(ListNode head){
5 ListNode pre = null ;
6 ListNode curr = head ;
7 while (curr!= null){
8 ListNode temp = curr.next ;
9 curr.next = pre ;
10 pre = curr ;
11 curr = temp;
12 }
13 return pre ;
14 }
合并:
1 private ListNode merge(ListNode head1, ListNode head2) {
2 ListNode curr1 = head1, curr2 = head2, temp1 = null, temp2 = null;
3 while (curr1.next != null && curr2 != null) {
4 temp1 = curr1.next;
5 temp2 = curr2.next;
6 curr1.next = curr2;
7 curr2.next = temp1;
8 curr1 = temp1;
9 curr2 = temp2;
10 }
11 if (curr2 != null) {
12 curr1.next = curr2;
13 curr2.next = null;
14 }
15 else {
16 curr1.next = null;
17 }
18 return head1;
19 }
插入:使用DUMMY head 避免了头部不确定, 头部为空等各种情况
1 public ListNode insert(ListNode head, int value) { 2 // Write your solution here 3 ListNode dummy = new ListNode(0); 4 dummy.next = head ; 5 ListNode pre = dummy ; 6 ListNode curr = head ; 7 while (curr != null && curr.val<=value){ 8 pre = curr ; 9 curr = curr.next ; 10 } 11 ListNode target = new ListNode(value) ; 12 pre.next = target ; 13 target.next = curr ; 14 //work for both cases: before head or in the middle 15 return dummy.next ; 16 }