Offer 14
输入一个链表,反转链表后,输出新链表的表头。
思路分析,定义三个指针 pre mid behind,将pre指向链表的头节点,mid指向head.nex,behind指向mid.next,将mid.next指向pre,然后江三个指针后移一位,将mid.next指向pre,直到behind.next为null。
//输入一个链表,反转链表后,输出新链表的表头。
public class Offer4 {
public static ListNode solution(ListNode head){
if (head==null){
return null;
}
//定义三个指针
ListNode front = head;
ListNode mid = head.next;
if (head.next==null){
return null;
}
ListNode behind = mid.next;
//将第一个指针与第二个指针断开连接
front.next=null;
while (behind!=null){
mid.next=front;
//将三个指针全后移
behind=behind.next;
mid=behind;
front=mid;
}
mid.next=front;
return mid;
}
}
剑指Offer15
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
思路:定义三个指针,其中两个指向两个链表的头部,另一个指向新链表的头节点,然后比较两个指针所指向节点值的大小,然后将其中小的节点加入新创建的链表中,知道指针指向为空。
public ListNode Merge(ListNode list1,ListNode list2) {
ListNode head1 = list1;
ListNode head2 = list2;
ListNode temp = new ListNode(-1);
ListNode newHead = temp;
while (head1!=null&&head2!=null){
if (head1.val<= head2.val){
newHead.next=head1;
head1 = head1.next;
}else{
newHead.next = head2;
head2 = head2.next;
}
newHead = newHead.next;
}
if (head1==null){
newHead.next=head2;
}else{
newHead.next=head1;
}
return temp.next;
}